import { type App } from 'vue'

/**
 * UniUtils 接口定义
 * 封装了常用的 uni-app API，提供统一的工具方法
 */
export interface UniUtils {
    /**
     * 显示轻提示
     * @param message - 提示内容
     * @param duration - 显示时长，默认2000ms
     */
    toast: (message: string, duration?: number) => void
    /**
     * 显示加载提示
     * @param title - 提示文字，默认'加载中...'
     */
    showLoading: (title?: string) => void
    /**
     * 隐藏加载提示
     */
    hideLoading: () => void
    /**
     * 跳转到指定页面
     * @param url - 目标页面路径
     */
    navigateTo: (url: string) => void
    /**
     * 获取本地存储
     * @param key - 存储的键名
     * @returns 存储的值，若不存在则返回null
     */
    getStorage: <T = any>(key: string) => T | null
    /**
     * 设置本地存储
     * @param key - 存储的键名
     * @param value - 要存储的值
     */
    setStorage: (key: string, value: any) => void
}

/**
 * uniUtils 实例
 * 实现了 UniUtils 接口，提供具体功能实现
 */
export const uniUtils: UniUtils = {
    /**
     * @see UniUtils.toast
     */
    toast(message, duration = 2000) {
        uni.showToast({
            title: message,
            icon: 'none',
            duration
        })
    },

    /**
     * @see UniUtils.showLoading
     */
    showLoading(title = '加载中...') {
        uni.showLoading({ title })
    },

    /**
     * @see UniUtils.hideLoading
     */
    hideLoading() {
        uni.hideLoading()
    },

    /**
     * @see UniUtils.navigateTo
     */
    navigateTo(url) {
        uni.navigateTo({ url })
    },

    /**
     * @see UniUtils.getStorage
     */
    getStorage(key) {
        return uni.getStorageSync(key)
    },

    /**
     * @see UniUtils.setStorage
     */
    setStorage(key, value) {
        uni.setStorageSync(key, value)
    }
}

/**
 * Vue 插件
 * 将 uniUtils 挂载到 Vue 实例的全局属性 $utils 上
 */
export default {
    /**
     * Vue 插件安装方法
     * @param app - Vue 应用实例
     */
    install(app: App) {
        app.config.globalProperties.$utils = uniUtils
    }
}
